#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      Administrador
#
# Created:     14/09/2011
# Copyright:   (c) Administrador 2011
# Licence:     <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

import ply.lex as lexer

palabras_reservadas =  ['CONTEXT','PRE','POST','INV','IMPLIES','NOT','OR','XOR','AND','IF','THEN','ELSE','ENDIF','PRE',
                       'SET','BAG','SEQUENCE','COLLECTION', 'LET']

palabras_reservadas_dict = dict([(x.lower(),x)for x in palabras_reservadas])

operadores_puntuacion = ["DOBLE_DOS_PUNTOS","DOS_PUNTOS","ABRE_PARENTESIS","CIERRA_PARENTESIS","IGUAL","SUMA","RESTA","MENOR","MENOR_IGUAL",
                        "MAYOR_IGUAL","MAYOR","DIVISION","MULTIPLICACION","DISTINTO","COMA","PUNTO_COMA","PUNTO","FLECHA","ABRE_LLAVE",
                        "CIERRA_LLAVE","PUNTO_PUNTO","ABRE_CORCHETE","CIERRA_CORCHETE","ARROBA","BARRA"]

operadores_puntuacion_dict = dict([(x,x)for x in operadores_puntuacion])

tokens = ("NAME","NUMBER") + tuple(palabras_reservadas_dict.values()) + tuple(operadores_puntuacion_dict.values())
#"STRING"

'----------------------FUNCIONES_VARIAS-------------------------------------'

def t_NAME(t):
    r'[a-zA-Z_]\w*'
    t.type=palabras_reservadas_dict.get(t.value,'NAME')
    return t

def t_NUMBER(t):
    r'[0-9][0-9]*(\.[0-9][0-9]*)?((e|E)(\+|-)?[0-9][0-9]*)?'
    string = str(t)
    if (('.' in string) or ('e' in string) or ('E' in string)):
        t.value=float(t.value)
    else:
        t.value=int(t.value)

    t.type=palabras_reservadas_dict.get(t.value,'NUMBER')
    return t

##def t_STRING(t):
##    r'(\'(([\'\\\\\\\n\\\r])|(\\\\([\n\t\b\r\f\\\\\'\\]|[0-7]([0-7]([0-7])?)?)))*\')|(\"(([\'\\\\\\\n\\\r])|(\\\\([\n\t\b\r\f\\\\\'\\]|[0-7]([0-7]([0-7])?)?)))*\")'
##    t.type=palabras_reservadas_dict.get(t.value,'STRING')
##    return t

#Ignorar espacios en blanco
t_ignore=' \t'

'----------------------OPERADORES_PUNTUACION-------------------------------------'

t_ABRE_LLAVE=r'\{'
t_CIERRA_LLAVE=r'\}'
t_ABRE_CORCHETE=r'\['
t_CIERRA_CORCHETE=r'\]'
t_ABRE_PARENTESIS=r'\('
t_CIERRA_PARENTESIS=r'\)'
t_PUNTO=r'\.'
t_COMA=r'\,'
t_DOS_PUNTOS=r'\:'
t_PUNTO_COMA=r'\;'
t_SUMA=r'\+'
t_RESTA=r'\-'
t_MULTIPLICACION=r'\*'
t_DIVISION=r'\/'
t_BARRA=r'\|'
t_IGUAL=r'\='
t_MENOR=r'\<'
t_MENOR_IGUAL=r'\<\='
t_MAYOR=r'\>'
t_MAYOR_IGUAL='r\>\='
t_DOBLE_DOS_PUNTOS=r'\:\:'
t_FLECHA=r'\-\>'
t_DISTINTO=r'\<\>'
t_PUNTO_PUNTO=r'\.\.'
t_ARROBA=r'\@'

#Contar nuevas lineas
def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

#Control de Errores
def t_error(t):
    print "\nlex: Error lexico en linea %d, token='%s'\n" % (t.lineno, t.value[0])
    t.lexer.skip(1)

lexer=lexer.lex()

if __name__=='__main__':
    entrada='''
    context PEPE
    0.0'''
    lexer.input(entrada)
    while True:
        tok=lexer.token()
        if not tok:break
        print tok
